package xu.jiang.report.dealer.report;

import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import xu.jiang.report.bean.StringKeyValue;
import xu.jiang.report.dto.LayerDTO;
import xu.jiang.report.util.report.POIUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * 模板绘制器(主要解决ui.layer重绘模板的需求) 在读取模板内容之前，先绘制模板内容
 *
 * @see
 * @author jx
 * @date 2017年6月1日 上午11:58:59
 */
public final class Painter {
    private final Map<String, String> uiParams;
    private final Sheet model;
    private static final String KEY = "ui.layer";
    /**
     * 考虑Excel的页签字数长度受限，无法写入复杂语句，故启用该属性，涂改模板默认页签值
     */
    private static final String COMPLEX_PAGE_COLUMN = "ui.complexPageColumn";

    /**
     * 模板的sheet名称
     * Excel中sheet命名有如下规则：
     *（1）sheet名称不能多于31个（包含英文、汉字、| 、（）等，但是不能包含： 、/、？、*、[]等 )，
     * 程序中使用poi工具来生成的时候，传进去大于31个长度的字符串时，会被自动截取，
     * 便会导致两个名字变为一样的，出现sheet同名异常
     * （2）sheet名字不能为空，如果是null 或者""也会报错。
     */
    public String sheetname_modelSheet = null;

    public Painter(Map<String, String> uiParams, Sheet model) {
        this.uiParams = uiParams;
        this.model = model;
    }

    /**
     * 模板绘制器 在读取模板内容之前，先绘制模板内容
     *
     * @see
     * @author jx
     * @date 2017年6月1日 上午11:58:59
     * @return 返回模版名称
     */
    public Painter draw() {

        if (uiParams == null || uiParams.size() <= 0) {
            return this;
        }


        /*
         * 更改模板页签默认值
         */
        String customPageColumn = uiParams.get(COMPLEX_PAGE_COLUMN);
        if (!StringUtils.isBlank(customPageColumn)) {
            /*
             * 经过测试，字段太长还是无法写入，故废弃
             */
            // POIUtil.renameSheet(this.model,customPageColumn);
            sheetname_modelSheet = customPageColumn;
            // 移除complexPageColumn
            this.uiParams.remove(COMPLEX_PAGE_COLUMN);
        }

        /*
         * 变更模板动态layer
         */
        String jsonStr = uiParams.get(KEY);
        if (StringUtils.isBlank(jsonStr)) {
            return this;
        }

        // init params
        Map<String, Class<StringKeyValue>> classMap = new HashMap<>();
        classMap.put("columns", StringKeyValue.class);

        JSONObject json = JSONObject.fromObject(jsonStr);
        LayerDTO layerDto = (LayerDTO) JSONObject.toBean(json, LayerDTO.class, classMap);

        int index = layerDto.getIndex() < 0 ? 0 : layerDto.getIndex();
        // 绘制
        // 遍历整个主模板Sheet

        for (int i = 0; i <= index; i++) {// 遍历行

            Row r = POIUtil.getOrCreateRow(this.model, i);
            if (i != index) {
                continue;
            }
            Row nextR = POIUtil.getOrCreateRow(this.model, i + 1);
            /*
             * 将列信息追加到该行中
             */
            for (int j = 0; j < layerDto.getColumns().size(); j++) {// 遍历单元格

                StringKeyValue v = layerDto.getColumns().get(j);
                Cell c = POIUtil.getOrCreateCell(r, j);
                Cell downC = POIUtil.getOrCreateCell(nextR, j);
                if (StringUtils.isNotBlank(v.getKey())) {
                    c.setCellValue(v.getKey());
                }
                if (StringUtils.isNotBlank(v.getValue())) {
                    downC.setCellValue(v.getValue());
                }

            }
        }

        // 移除key
        this.uiParams.remove(KEY);
        return this;
    }

}

